"""
数据处理工具函数
"""
import pandas as pd
import numpy as np
from flask import current_app
from typing import Tuple, List, Dict, Optional, Union
import uuid
import time
import os

def generate_unique_filename(original_filename: str) -> str:
    """
    生成唯一的文件名
    
    Args:
        original_filename: 原始文件名
        
    Returns:
        str: 唯一的文件名
    """
    # 获取文件扩展名
    ext = os.path.splitext(original_filename)[1]
    # 生成唯一标识符（时间戳 + UUID的前8位）
    unique_id = f"{int(time.time())}_{str(uuid.uuid4())[:8]}"
    # 返回新的文件名
    return f"{unique_id}{ext}"

def allowed_file(filename: str) -> bool:
    """
    检查文件类型是否允许
    
    Args:
        filename: 文件名
        
    Returns:
        bool: 是否允许
    """
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in current_app.config['ALLOWED_EXTENSIONS']

def process_file(file_path: str, preview_rows: Optional[int] = None) -> Union[Tuple[int, List[Dict]], Dict]:
    """
    处理数据文件，获取行数和列信息
    
    Args:
        file_path: 文件路径
        preview_rows: 预览行数，如果指定则返回预览数据
        
    Returns:
        如果preview_rows为None:
            Tuple[int, List[Dict]]: (总行数, 列信息列表)
        否则:
            Dict: 预览数据，包含列名和数据行
    """
    # 根据文件类型读取数据
    if file_path.endswith('.csv'):
        df = pd.read_csv(file_path)
    else:  # Excel文件
        df = pd.read_excel(file_path)
    
    if preview_rows is not None:
        # 确保数据可以被JSON序列化
        preview_data = df.head(preview_rows).replace({
            np.nan: None,  # 将NaN转换为None
            np.inf: None,  # 将inf转换为None
            -np.inf: None  # 将-inf转换为None
        })
        
        return {
            'columns': df.columns.tolist(),
            'data': preview_data.to_dict('records')
        }
    
    # 获取列信息
    column_info = []
    for col in df.columns:
        dtype = str(df[col].dtype)
        if 'int' in dtype:
            col_type = 'integer'
        elif 'float' in dtype:
            col_type = 'float'
        elif 'datetime' in dtype:
            col_type = 'datetime'
        else:
            col_type = 'string'
            
        # 确保nullable是Python原生的bool类型
        is_nullable = bool(df[col].isnull().any())
            
        column_info.append({
            'name': col,
            'type': col_type,
            'nullable': is_nullable
        })
    
    return len(df), column_info 